package com.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**
 * Knife4j 配置类
 * @Author: MrPeng
 * @CreateTime: 2025-05-01
 */
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {

    @Value("${project.groupName:研发小组1}")
    private String groupName;

    @Value("${project.title:测试系统_接口文档}")
    private String title;

    /**
     * 创建API文档配置
     */
    @Bean
    @Profile({"dev", "test", "show"}) // 设置在哪些环境中启用 Swagger
    public Docket createApi(Environment environment) {
        return new Docket(DocumentationType.OAS_30)
                .groupName(groupName)
                .enable(true) // 启用 Swagger
                .select()
                // 只扫描 com.ruoyi.web.controller.dhxt 包
                //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .apis(RequestHandlerSelectors.basePackage("com.demo.controller"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }

    /**
     * API 文档基本信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(title)
                .description("用于系统模块后台业务接口。")
                .contact(new Contact("系统模块", null, null))
                .version("版本号: 1.0")
                .build();
    }

    //    @Api                   用于类，标识这个类是swagger的资源
    //    @ApiSupport(author = "xiaoymin@foxmail.com")用于Controller类，当前接口作者
    //    @ApiIgnore             用于类，忽略该 Controller，指不对当前类做扫描
    //    @ApiOperation          用于方法，描述 Controller类中的 method接口
    //    @ApiParam              用于参数，单个参数描述，与 @ApiImplicitParam不同的是，
    //                           他是写在参数左侧的。如（ @ApiParam(name="username",value="用户名")String username）
    //    @ApiModel              用于类，表示对类进行说明，用于参数用实体类接收
    //    @ApiProperty           用于方法，字段，表示对model属性的说明或者数据操作更改
    //    @ApiImplicitParam      用于方法，表示单独的请求参数
    //                           header-->请求参数的获取：@RequestHeader(代码中接收注解)
    //                           query-->请求参数的获取：@RequestParam(代码中接收注解)
    //                           path（用于restful接口）-->请求参数的获取：@PathVariable(代码中接收注解)
    //                           body-->请求参数的获取：@RequestBody(代码中接收注解)
    //                           form（不常用）
    //    @ApiImplicitParams     用于方法，包含多个 @ApiImplicitParam
    //    @ApiResponse           用于方法，描述单个出参信息
    //    @ApiResponses          用于方法，包含多个@ApiResponse
    //    @ApiError              用于方法，接口错误所返回的信息
}
